package com.hxzy.service.system.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hxzy.dto.system.SysDeptSearchDTO;
import com.hxzy.mapper.system.SysDeptMapper;
import com.hxzy.entity.system.SysDept;
import com.hxzy.service.system.SysDeptService;
import com.hxzy.vo.SysDeptVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 部门
 * @author Administrator
 */
@Service
public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper,SysDept> implements SysDeptService {


    @Override
    public List<SysDept> search(SysDeptSearchDTO searchDTO) {
        return this.getBaseMapper().search(searchDTO);
    }

    /**
     * 构建前端所需要的树
     * @param arr
     * @return
     */
    @Override
    public List<SysDeptVO> buildDept(List<SysDept> arr) {
        List<SysDeptVO> returnList=new ArrayList<>();

        //先记录当前查询出来所有的id
        List<Long> tempList=new ArrayList<>();

        for(SysDept dept : arr){
            tempList.add(dept.getId());
        }

        //遍历所有的节点
        for(SysDept dept: arr){
            // 如果id不在临时集合里面，就说明它是顶级顶级节点,就是遍历节点的所有子节点
            if(!tempList.contains(dept.getParentId())){
                SysDeptVO  sysDeptVO=new SysDeptVO();
                BeanUtils.copyProperties(dept,sysDeptVO);
                //查询它的子节点
                this.recursionFn(arr,sysDeptVO);

                returnList.add(sysDeptVO);
            }
        }

        //如果returnList的结果为0代表没有顶级节点,就把当前查询的结果返回
        if(returnList.isEmpty()){
            for(SysDept dept: arr){
                SysDeptVO  sysDeptVO=new SysDeptVO();
                BeanUtils.copyProperties(dept,sysDeptVO);
                returnList.add(sysDeptVO);
            }
        }

        return returnList;
    }

    /**
     * 递归子节点
     * @param arr
     * @param parent
     */
    private void recursionFn(List<SysDept> arr, SysDeptVO parent){
       List<SysDeptVO>  childList=new ArrayList<>();

       for(SysDept dept : arr){
           if(dept.getParentId().intValue()==parent.getId().intValue()) {
               SysDeptVO  sysDeptVO=new SysDeptVO();
               BeanUtils.copyProperties(dept,sysDeptVO);
               recursionFn(arr,sysDeptVO);
               childList.add(sysDeptVO);
           }
       }


       if(childList.size()>0){
           parent.setChildren(childList);
       }
    }
}
